all repos — caroster @ f3511f2779032e0280e592bc77adefcaac5b9abb

[Octree] Group carpool to your event https://caroster.io

frontend/pages/e/[uuid]/index.tsx (view raw)

  1import {useState, useReducer, PropsWithChildren} from 'react';
  2import Box from '@mui/material/Box';
  3import {getSession, useSession} from 'next-auth/react';
  4import TravelColumns from '../../../containers/TravelColumns';
  5import NewTravelDialog from '../../../containers/NewTravelDialog';
  6import VehicleChoiceDialog from '../../../containers/VehicleChoiceDialog';
  7import pageUtils from '../../../lib/pageUtils';
  8import EventLayout, {TabComponent} from '../../../layouts/Event';
  9import {
 10  EventByUuidDocument,
 11  FindUserVehiclesDocument,
 12  VehicleEntity,
 13  useFindUserVehiclesQuery,
 14} from '../../../generated/graphql';
 15
 16interface Props {
 17  eventUUID: string;
 18  announcement?: string;
 19}
 20
 21const Page = (props: PropsWithChildren<Props>) => {
 22  return <EventLayout {...props} Tab={TravelsTab} />;
 23};
 24
 25const TravelsTab: TabComponent<Props> = () => {
 26  const session = useSession();
 27  const [openNewTravelDialog, setNewTravelDialog] = useState(false);
 28  const [openVehicleChoice, toggleVehicleChoice] = useReducer(i => !i, false);
 29  const [selectedVehicle, setSelectedVehicle] = useState<VehicleEntity>();
 30
 31  const isAuthenticated = session.status === 'authenticated';
 32  const {data} = useFindUserVehiclesQuery({
 33    skip: !isAuthenticated,
 34  });
 35  const vehicles = data?.me?.profile?.vehicles?.data || [];
 36
 37  const addTravelClickHandler =
 38    isAuthenticated && vehicles?.length != 0
 39      ? toggleVehicleChoice
 40      : () => setNewTravelDialog(true);
 41
 42  return (
 43    <Box>
 44      <TravelColumns showTravelModal={addTravelClickHandler} />
 45      <NewTravelDialog
 46        key={selectedVehicle?.id || 'noVehicle'}
 47        opened={openNewTravelDialog}
 48        toggle={() => setNewTravelDialog(false)}
 49        selectedVehicle={selectedVehicle}
 50      />
 51      <VehicleChoiceDialog
 52        open={openVehicleChoice}
 53        toggle={toggleVehicleChoice}
 54        setNewTravelDialog={setNewTravelDialog}
 55        setSelectedVehicle={setSelectedVehicle}
 56        vehicles={vehicles}
 57      />
 58    </Box>
 59  );
 60};
 61
 62export const getServerSideProps = pageUtils.getServerSideProps(
 63  async (context, apolloClient) => {
 64    const {uuid} = context.query;
 65    const {host = ''} = context.req.headers;
 66    const session = await getSession(context);
 67    let event = null;
 68
 69    // Fetch event
 70    try {
 71      const {data} = await apolloClient.query({
 72        query: EventByUuidDocument,
 73        variables: {uuid},
 74      });
 75      event = data?.eventByUUID?.data;
 76    } catch (error) {
 77      return {
 78        notFound: true,
 79      };
 80    }
 81
 82    // Fetch user vehicles
 83    if (session)
 84      await apolloClient.query({
 85        query: FindUserVehiclesDocument,
 86      });
 87
 88    return {
 89      props: {
 90        eventUUID: uuid,
 91        metas: {
 92          title: event?.attributes?.name || '',
 93          url: `https://${host}${context.resolvedUrl}`,
 94        },
 95      },
 96    };
 97  }
 98);
 99
100export default Page;